package com.ruoyi.ade.llm.utils;

import com.alibaba.fastjson.JSONArray;
import com.ruoyi.ade.llm.model.Ade;
import com.ruoyi.ade.tool.AdeJsonFormatUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * 药物不良反应事件数据处理工具
 *
 */
public class AdeDataProcessUtils {


    /**
     * 过滤无效的ADE
     *    （1） [{}]
     *    （2）{"sentence":""}中没有reactions
     *    （3）{"sentence":"","drugs":["未知"],"reactions":["未知反应"]}
     * @param json
     * @return   过滤后的json
     */
    public static String filterAdesJson(String json) {
        if(StringUtils.isEmpty(json)) return "[]";
        if("[{}]".equals(json))return "[]";
        List<Ade> tmps =  JSONArray.parseArray(json, Ade.class);
        return JSONArray.toJSONString(filterAdes(tmps));
    }

    /**
     * 过滤无效的ADE
     * @param ades
     * @return
     */
    public static List<Ade> filterAdes(List<Ade> ades){
        List<Ade> result = new ArrayList<>();
        for(Ade ade:ades){
            //reactions为空则认为不是有效ADE
            if(ade.getReactions()==null||ade.getDrugs()==null){  //如果没有药物不良反应信息 则是无效的ADE
                continue;
            }
            // 去除无效的 reaction 实体
            List<String> removeReactions = new ArrayList<>();
            for(String reaction:ade.getReactions()){
                if(reaction.contains("未指定")
                        || reaction.contains("未知")
                        ||reaction.contains("未特指")
                        || reaction.contains("其他可能")
                        || reaction.contains("未明确")
                        || reaction.contains("未具体")
                ){
                    removeReactions.add(reaction);
                }
            }
            ade.getReactions().removeAll(removeReactions);

            //如果reactions为空则认为不是有效ADE
            if(ade.getReactions().size()==0){
                continue;
            }
            //去掉未指定、未知的药品
            List<String> removes = new ArrayList<>();
            for(String drug:ade.getDrugs()){
                if(drug.contains("未指定")
                        || drug.contains("未知")
                        ||drug.contains("未特指")
                        || drug.contains("其他可能")
                        || drug.contains("未明确")
                        || drug.contains("未具体")
                        || drug.contains("...药物")
                        || drug.contains("不详")
                        || drug.contains("不明药物")
                        || drug.contains("模拟")
                        || "药物".equals(drug)){
                    removes.add(drug);
                }
            }
            ade.getDrugs().removeAll(removes);

            //统一规范化 药物信息
            AdeJsonFormatUtils.formatDrugs(ade);
//            for(int i=0;i<ade.getDrugs().size();i++){
//                if(ade.getDrugs().get(i).contains("化疗")) ade.getDrugs().set(i,"化疗药");
//            }

            result.add(ade);
        }
        return result;
    }


    /**
     *  将大模型输出的JSON字符串转化为 ADE列表
     *     - 需要校验输出的JSON格式是否正确
     * @param json    大模型输出的JSON格式回答
     * @return
     */
    public static List<Ade> getResult(String json) {

        if (json.startsWith("```json")) {
            json = json.substring(json.indexOf('['), json.lastIndexOf(']') + 1);
        }

        if (json.contains("```")) {
            json = json.substring(0, json.indexOf("`")).trim();
        }

        if ("[{}]".equals(json)) return new ArrayList<>();

        if (json.endsWith("\"")) json = json.substring(0, json.length() - 1);

        if (json.endsWith("}")) json = json.substring(0, json.length() - 1);
        try {
            List<Ade> ades = JSONArray.parseArray(json, Ade.class);
            return ades;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("AdeDataProcessUtils==========================@@" + json + "@@" + e.getMessage());
        }
        return new ArrayList<>();
    }
}
